/**
 * 
 */

console.log("toma pa vos");

var Trait=function(){};

Trait.prototype.cumple = function(arrayParam) { 
	var arrParam = arrayParam.slice();
	console.log("cumple length array "+arrayParam.length);
	console.log("cumple length "+arrParam.length);
	if(arrParam.length==0){
		return true;
	}else{
		var caractDelArraYParam= arrParam.shift();
		console.log("cumple array param "+caractDelArraYParam);
		var i=this.caracteristicas.indexOf(caractDelArraYParam);//
		console.log("cumple "+i);
		if(i<=0){
			return false;
		}else{
			
			var caractLocal = this.caracteristicas[i];
			
			return ((caractLocal==caractDelArraYParam) && this.cumple(arrParam));
		}
	}
};


Trait.prototype.cumpleD = function(arrayParam) { 
	
	for ( var int = 0; int < arrayParam.length; int++) {
		var caractDelArraYParam = arrayParam[int];
		var i=this.caracteristicas.indexOf(caractDelArraYParam);//
		
		if(i<=0){
			return false;
		}	
	}
	return true;
	
};


//esta es la estructura comun de nuestros AUla, Caracteristica, Curso
var EstructuraComun=function(){};

EstructuraComun.prototype={
		// no es necesario definir aca las variables de estado, le dejo a modo de "regla" .. no 
		// no es necesario x q en los contructores q vana usar esto ya se define
		id: "",
 		caracteristicas: [],
		getId: function() { return this.id;},
		getCaracteristicas: function() {return this.caracteristicas;}		
};

EstructuraComun.prototype.getCaractByName=function(name){
	
	for ( var int = 0; int < this.caracteristicas.length; int++) {
		var caracteristica = this.caracteristicas[int];
		if(caracteristica.getId()==name){
			return caracteristica;
		}
	}
	//si no la encuetro? retorna undefined... obvio
};
//constructores
var Caracteristica=function(nom,  paramCaracteristicasArray){
	this.id = nom; //"Cañon"
	this.puntaje=0; //int 
	this.caracteristicas=paramCaracteristicasArray;
};

var Caracteristica=function(nom, ptaje, paramCaracteristicasArray){
	this.id = nom; //"Cañon"
	this.puntaje=ptaje; //int 
	this.caracteristicas=paramCaracteristicasArray;
};

/// funciones de comparacion
//mayorIgual=function(a,b){
//	return a>=b;
//};
//igual=function(a,b){
//	return a==b;
//};
//menorIgual=function(a,b){
//	return a<=b;
//};
//
//asignarComparador=function(objeto,funcion){
//	objeto.funcComparacion=funcion;
//};

//ojo para definir el prototype con un new... esa clase debe estar antes!!!!
//Caracteristica.prototype= new EstructuraComun();
//Caracteristica.prototype.cumple=Trait.prototype.cumple;
//Caracteristica.prototype.funcComparacion=mayorIgual;
//
//
//
//Caracteristica.prototype.cumpleCaract = function(caract) {
//			return (this.id==caract.id 
//					&&
//					caract.funcComparacion(this.puntaje,caract.puntaje)
//					);
//};


var Aula=function(paramId, paramCapacidad, paramCaracteristicasArray)
{	//se podria hacer un constructor, q reciba n strings y arme un array con los elementos 2 al ultimo
	this.id=paramId;
	this.capacidad=paramCapacidad;
	this.caracteristicas=paramCaracteristicasArray;
};

/*
var Aula = new Schema(
		{
			id : ObjectId,
			capacidad : Number,
			caracteristicas : [ String ]
		}
	);
*/
Aula.prototype = new EstructuraComun();
Aula.prototype.cumple=Trait.prototype.cumple;



var Curso=function(id,caractList){
	this.id = id;
	this.caracteristicas = caractList;
	//tiene una lista de caracteristicas pero representan las REQUERIDAS
};
Curso.prototype = new EstructuraComun();
Curso.prototype.requiere=Trait.prototype.cumple;

/*
var Curso = new Schema(
		{
			id : ObjectId,
			capacidad : Number,
			caracteristicas : [ String ]
		}
	);
*/

var Asignador=function(aulasList, cursosList){
	this.aulasDisponibles=aulasList.slice();
	this.cursos=cursosList; // puedo usar directamente este array, ya q no lo midiufico
	this.resultado= new Array(); // la idea es q cada curso sea key de una lista de aulas posibles
	
};

Asignador.prototype.asignar=function(){	
	for ( var int = 0; int < this.cursos.length; int++) {
		this.resultado[int]=[]; //en el array resultado, 
										//pongo en la misma posicion un array vacio,
										//para agregarle aulas q cumplan
		for ( var aula =0; aula < this.aulasDisponibles.length; aula++) {
//			console.log(this.aulasDisponibles[aula]);
			if(this.aulasDisponibles[aula].cumpleD(this.cursos[int].getCaracteristicas())){
				this.resultado[int].push(this.aulasDisponibles[aula]);
//				console.log("se agrega aula"+this.aulasDisponibles[aula]);
			}
		}
	}
	this.printResults();
};

Asignador.prototype.printResults=function(){
	console.log("+============================================");
	for ( var int = 0; int < comp.resultado.length; int++) {
		var curso = this.cursos[int];
		console.log(" | Curso Id: "+curso.id);
		
		for ( var int2 = 0; int2 < this.resultado[int].length; int2++) {
			console.log(" __|----->Id Aula posible: "+this.resultado[int][int2].id);
		}
		console.log("+-----------------------------------+");
	}
	console.log("+============================================+");
};
Asignador.prototype.printResultsHTML=function(){
//	console.log("<table border='1' cellspacing='0'>");
	for ( var int = 0; int < comp.resultado.length; int++) {
		var curso = this.cursos[int];
//		console.log("<tr><th>Curso Id: "+curso.id+"</th></tr>");
		
		for ( var int2 = 0; int2 < this.resultado[int].length; int2++) {
			console.log("<tr><td>Id Aula posible: "+this.resultado[int][int2].id+"</td></tr>");
		}
	}
	console.log("</table>");
};

//<!-- estos son los sysouts... -->
console.log("Esto se ve en la consola js de los exploradores!!!");
//

//creo caracteristicas

//var puestosAula = new Caracteristica("Capacidad",20,[]);
//var puestosAula = new Caracteristica("Capacidad",20,[]);
//
//var matricula = new Caracteristica("Capacidad",10,[]);
//var matricula2 = new Caracteristica("Capacidad",20,[]);
//
//
//var canion   = new Caracteristica("Cañon", 5,[]);
//var canionHD = new Caracteristica("Cañon", 10,[]);
//
//var monitor = new Caracteristica("Monitor", 3, []);
//var monitorLCD = new Caracteristica("Monitor", 6, []);
//
//var pc 			= new Caracteristica("PC", 3,[monitor]);
//var pcDeveloper = new Caracteristica("PC", 8,[monitorLCD]);
//
//var pcReq		= new Caracteristica("PC", 3,[monitorLCD]);

var canion   = "Cañon";
var canionHD = "CañonHD";

var monitor = "Monitor";
var monitorLCD = "MonitorLCD";

var pc 			= "PC";
var pcDeveloper = "PCDeveloper";

var pcReq		= "PC";


var c = new Curso("Curso Java",[pcDeveloper]);
var d = new Curso("Curso Costura ",[canionHD]);
var e = new Curso("Curso Excel",[pcReq,canion]);


var aula1 = new Aula(1,10, [pcDeveloper, canionHD]);
var aula2 = new Aula(2,10, [canionHD]);
console.log("aula 1 "+aula1.caracteristicas.length);
console.log("aula 2 "+aula2.caracteristicas.length);

//console.log("aula cumple "+aula1.caracteristicas.indexOf(canionHD));
//console.log(aula1.cumple(["canionHD"]));
//console.log(pcDeveloper==pcDeveloper);
//asignarComparador(canion,mayorIgual);


var comp = new Asignador([aula1,aula2],[c,d ,e]);
comp.asignar();
console.log("aula 1 "+aula1.caracteristicas.length);
console.log("aula 2 "+aula2.caracteristicas.length);

console.log("<br /><br />fin");
